{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 预训练数据\n",
    "\n",
    "## 数据来源\n",
    "\n",
    "分类为通用数据和专业数据\n",
    "\n",
    "通用数据包括网页、图书、新闻、对话文本等内容。规模大、多样性和易获取，支持大语言模型的语言建模和泛化能力\n",
    "\n",
    "专业数据包括多语言数据、科学数据、代码以及领域特有资料等数据。提供大模型的任务解决能力\n",
    "\n",
    "### 通用数据\n",
    "\n",
    "1. 网页 代表数据集 ClueWeb09、ClueWeb12、SogouT-16、CommonCrawl\n",
    "2. 对话数据 PushShift.io Reddit、Ubuntu Dialogue Corpus、Douban Conversation Corpus、Chromium Conversations Corpus\n",
    "3. 书籍 Pile中的Books3、Bookcorpus2\n",
    "\n",
    "### 专业数据\n",
    "1. 多语言数据（Multilingual Text）对于增强大语言模型语言理解和生成多语言能力具有至关重\n",
    "要的作用。通过多语言混合训练，预训练模型中可以在一定程度上自动构建多\n",
    "语言之间的语义关联。因此，多语言数据混合训练，可以有效提升翻译、多语言摘要和多语言\n",
    "问答等任务能力。此外，由于不同语言中不同类型的知识获取难度不同，多语言数据还可以有效\n",
    "增加数据的多样性和知识的丰富性。\n",
    "2. 科学文本（Scientific Text）包括教材、论文、百科以及其他相关资源。这些数据对于提升大\n",
    "型语言模型在理解科学知识方面具有重要作用。\n",
    "科学文本数据的来源主要包括 arXiv 论文、PubMed 论文、教材、课件和教学网页等。\n",
    "公式可以使用\n",
    "LaTeX 语法进行表示，化学结构可以使用 SMILES（Simplified Molecular Input Line Entry System）表示，蛋白质序列可以使用单字母代码或三字母代码\n",
    "3. 代码（Code）数据是进行程序生成任务所必须的训练数据。\n",
    "\n",
    "## 数据处理\n",
    "\n",
    "流程：质量过滤、冗余去除、消除隐私、词元切分\n",
    "\n",
    "### 低质过滤\n",
    "\n",
    "大语言模型训练中所使用的低质量数据过滤方法可以大致分为两类：基于分类器的方法和基于启发式的方法。\n",
    "\n",
    "- 基于分类器的方法目标是训练文本质量判断模型，并利用该模型识别并过滤低质量数据\n",
    "- 基于启发式的方法则通过一组精心设计的规则来消除低质量文本，这些启发式规则主要包括：\n",
    "\n",
    "    * 语言过滤：如果一个大语言模型仅关注一种或者几种语言，那么就可以大幅度地过滤掉数据\n",
    "    中其他语言的文本。\n",
    "\n",
    "    * 指标过滤：利用评测指标也可以过滤低质量文本。例如，可以使用语言模型对于给定文本的\n",
    "    困惑度（Perplexity）进行计算，利用该值可以过滤掉非自然的句子。\n",
    "\n",
    "    * 统计特征过滤：针对文本内容可以计算包括标点符号分布、符号字比（Symbol-to-Word Ratio）、\n",
    "    句子长度等等在内的统计特征，利用这些特征过滤低质量数据。\n",
    "\n",
    "    * 关键词过滤：根据特定的关键词集，可以识别和删除文本中的噪声或无用元素，例如，HTML\n",
    "    标签、超链接以及冒犯性词语等。\n",
    "\n",
    "### 冗余去除\n",
    "\n",
    "文本冗余发现（Text Duplicate Detection）也称为文本重复检测，是自然语言处理和信息\n",
    "检索中的基础任务之一，其目标是发现不同粒度上的文本重复，包括句子、段落以及文档等不同\n",
    "级别。冗余去除就是在不同的粒度上进行去除重复内容，包括句子、文档和数据集等粒度的重复。\n",
    "\n",
    "包含重复单词或短语的句子很可能造成语言建模中引入重复的\n",
    "模式。这对语言模型来说会产生非常严重的影响，使得模型在预测时容易陷入重复循环（Repetition\n",
    "Loops）。\n",
    "\n",
    "此外，数据集层面也可能存在一定数量的重复情况，比如很多大语言模型预训练集合都会包\n",
    "含 GitHub、Wikipedia、C4 等数据集。还需要特别注意的是，预训练语料中混入测试语料，从而造\n",
    "成数据集污染的情况。在实际产生预训练数据时，需要从数据集、文档以及句子三个级别去除重\n",
    "复，这对于改善语言模型的训练具有重要的作用。\n",
    "\n",
    "### 隐私消除\n",
    "\n",
    "由于绝大多数预训练数据源于互联网，因此不可避免地会包含涉及敏感或个人信息（Personally\n",
    "Identifiable Information，PII）的用户生成内容，这可能会增加隐私泄露的风险。\n",
    "\n",
    "删除隐私数据最直接的方法是采用基于规则的算法。\n",
    "\n",
    "### 词元切分\n",
    "\n",
    "传统的自然语言处理通常以单词为基本处理单元，模型都依赖预先确定的词表 V，在编码输入\n",
    "词序列时，这些词表示模型只能处理词表中存在的词。因此，在使用中，如果遇到不在词表中的未\n",
    "登录词，模型无法为其生成对应的表示，只能给予这些未登录词（Out-of-Vocabulary，OOV）一个默认\n",
    "的通用表示。在深度学习模型中，词表示模型会预先在词表中加入一个默认的“[UNK]”（unknown）\n",
    "标识，表示未知词，并在训练的过程中将 [UNK] 的向量作为词表示矩阵的一部分一起训练，通过\n",
    "引入某些相应机制来更新 [UNK] 向量的参数。在使用时，对于全部的未登录词，都使用 [UNK] 的\n",
    "向量作为这些词的表示向量。此外，基于固定词表的词表示模型对词表大小的选择比较敏感。当\n",
    "词表大小过小时，未登录词的比例较高，影响模型性能。而当词表大小过大时，大量低频词出现\n",
    "在词表中，而这些词的词向量很难得到充分学习。理想模式下，词表示模型应能覆盖绝大部分的\n",
    "输入词，并避免词表过大所造成的数据稀疏问题。\n",
    "\n",
    "为了充分学习这些构词模式，研究人员们提出了子词词元化（Subword Tokenization）\n",
    "方法，试图缓解上文介绍的未登录词问题。\n",
    "\n",
    "词元分析（Tokenization）目标是将原始文本分割成由词元\n",
    "（Token）序列的过程。词元切分也是数据预处理中至关重要的一步。\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    " "
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
